/**
 * @file bi_tree_array.h
 * @brief 二叉树的顺序结构实现
 * @author Xavier ZXY (zxy_xavier@163.com)
 * @version : 1.0
 * @date 2022-05-18
 * 
 */

#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0

#define MAXSIZE 100 /* 存储空间初始分配量 */
#define MAX_TREE_SIZE 100 /* 二叉树的最大结点数 */

typedef int Status;		/* Status是函数的类型,其值是函数结果状态代码，如OK等 */
typedef int TElemType;  /* 树结点的数据类型，目前暂定为整型 */
typedef TElemType SqBiTree[MAX_TREE_SIZE]; /* 0号单元存储根结点  */

typedef struct
{
    int level, order; //结点的层，本层序号(按照满二叉树计算)
}Position;

TElemType Nil = 0;

Status visit(TElemType c);  //打印节点数据

Status InitBiTree(SqBiTree T);  //构造空二叉树

Status CreateBiTree(SqBiTree T);  //构造顺序存储的二叉树T

#define ClearBiTree InitBiTree  //清空二叉树

Status BiTreeEmpty(SqBiTree T); //二叉树是否为空

int BiTreeDepth(SqBiTree T);  //返回T的深度

Status Root(SqBiTree T, TElemType *e);  //返回二叉树的根节点

TElemType Value(SqBiTree T, Position e);  //发牛对应位置e的节点值

Status Assign(SqBiTree T, Position e, TElemType value);  //给位于位置e的结点赋新值value

TElemType Parent(SqBiTree T, TElemType e);  //返回e结点的双亲

TElemType LeftChild(SqBiTree T, TElemType e);  //返回e结点的左孩子

TElemType RightChild(SqBiTree T, TElemType e);  //返回e结点的右孩子

TElemType LeftSibling(SqBiTree T, TElemType e);  //返回e结点的左兄弟

TElemType RightSibling(SqBiTree T, TElemType e);  //返回e结点的右兄弟

//前序遍历
void PreTraverse(SqBiTree T,int e);
Status PreOrderTraverse(SqBiTree T);

//中序遍历
void InTraverse(SqBiTree T,int e);
Status InOrderTraverse(SqBiTree T);

//后序遍历
void PostTraverse(SqBiTree T,int e);
Status PostOrderTraverse(SqBiTree T);

// 层序遍历
void LevelOrderTraverse(SqBiTree T);

//逐层,按本层序号输出二叉树
void Print(SqBiTree T);
